<?php

class AdmNotificacionDetalle extends TPage {
//<editor-fold defaultstate="collapsed" desc="Verifica Usuario Logueado">
  /**
   * determina si el usuario esta logueado en el sistema
   * @author VSR, 01/01/2011
   */
  private function usuarioLogueado(){
    $estaLogueado = false;
    try {
      $session = new THttpSession;
      $session->open();
      $oUsuario = $session[Usuario::NOMBRE_ENTIDAD];
      if(isset($oUsuario)){
        $estaLogueado = true;
      }
    } catch (Exception $e) {
      $estaLogueado = false;
    }
    return $estaLogueado;
  }

  /**
   * redirecciona al login
   * @author VSR, 01/01/2011
   */
  private function redireccionarLogin(){
    $this->Response->redirect($this->Service->constructUrl("Admin"));
  }
//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Constantes">
  const SESION_DATOS = "arr";
  //funciones pagina
  const FUNCION_VER = "Ver";
  const FUNCION_CREAR = "Crear";
  const FUNCION_EDITAR = "Editar";
  const FUNCION_ELIMINAR = "Eliminar";
  //indices arreglo
  const ARRAY_DETALLE = 0;
  const ARRAY_LISTADO_USUARIOS = 1;

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Privados">
  /**
   * obtiene los registros desde la base de datos
   * @author VSR, 01/01/2011
   */
  private function obtenerDatos($idNotificacion){
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $arr = Notificacion::obtenerDetalle($idNotificacion);
      Utilidades::grabarSessionPorNombre(self::SESION_DATOS.$nombrePagina, $arr);

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * actualiza los controles de la pagina segun los datos obtenidos
   * @author VSR, 01/01/2011
   */
  private function actualizaInterfaz(){
    $totalRegistros = 0;
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $idNotificacion = $this->Request["id"];
      $arr = Utilidades::obtenerSessionPorNombre(self::SESION_DATOS.$nombrePagina);

      //inicializa controles en vacio
      $titulo = "";
      $controlHtmlAsociado = "";
      $fechaInicio = "";
      $fechaTermino = "";
      $skin = "";
      $ajusteTop = "-100";
      $ajusteLeft = "";
      $ancho = "250";
      $recordarCada = "30";
      $activo = "0";
      $descripcion = "";
      $posicion = "";
      $estado = "";
      $diferenciaDias = "";
      $paginaAsociada = "";

      if(!is_null($arr)) {
        $arrDetalle = $arr[self::ARRAY_DETALLE];
        $totalRegistros = count($arrDetalle);
        if($totalRegistros > 0) {
          $row = $arrDetalle[0];
          $titulo = $row["Titulo"];
          $controlHtmlAsociado = $row["ControlHtmlAsociado"];
          $fechaInicio = $row["FechaInicio"];
          $fechaTermino = $row["FechaTermino"];
          $skin = $row["Skin"];
          $ajusteTop = $row["AjusteTop"];
          $ajusteLeft = $row["AjusteLeft"];
          $ancho = $row["Width"];
          $recordarCada = $row["RecordarCada"];
          $activo = $row["Activo"];
          $descripcion = $row["Descripcion"];
          $posicion = $row["Posicion"];
          $estado = $row["Estado"];
          $diferenciaDias = $row["DiferenciaDias"];
          $paginaAsociada = $row["PaginaAsociada"];
        }
      }
      $this->lblTituloFormulario->Text = (($idNotificacion == "0") ? "Crear" : "Modificar")." Notificaci&oacute;n";
      $this->txtIdNotificacion->Value = $idNotificacion;
      $this->txtTitulo->Text = $titulo;
      $this->txtControlHtmlAsociado->Text = $controlHtmlAsociado;
      $this->txtFechaInicio->Text = $fechaInicio;
      $this->txtFechaTermino->Text = $fechaTermino;
      $this->ddlSkin->asignarSelectedValue($skin);
      $this->txtAjusteTop->Text = $ajusteTop;
      $this->txtAjusteLeft->Text = $ajusteLeft;
      $this->txtAncho->Text = $ancho;
      $this->txtRecordarCada->Text = ($recordarCada == "-1") ? "" : $recordarCada;
      $this->chkActivo->Checked = ($idNotificacion == "0") ? true : (($activo == "1" ? true : false));
      $this->txtDescripcion->Text = $descripcion;
      $this->ddlPosicion->asignarSelectedValue($posicion);
      $this->txtPaginaAsociada->Text = $paginaAsociada;

      //actualiza el multiselect
      $arrListadoUsuarios = $arr[self::ARRAY_LISTADO_USUARIOS];
      if(!is_null($arrListadoUsuarios)) {
        $this->msUsuarios->dataSourceHija($arrListadoUsuarios);
        $this->msUsuarios->dataTextFieldHija("Texto");
        $this->msUsuarios->dataValueFieldHija("Valor");
        $this->msUsuarios->dataBindHija();
        $asignar = (count($arrListadoUsuarios) == 0) ? "Todos" : "Personalizado";
      } else {
        $asignar = "Todos";
      }
      $this->Page->ClientScript->registerEndScript("asignarUsuarios", "mostrarListadoUsuarioNotificacion('$asignar');");

      //setea texto plazo
      switch ($estado) {
        case "Vencido":
          $textoPlazoDias = "<span class=\"cssInactivo\">[Terminado]</span>";
          $this->hBotonAplicar->Visible = false;
          $this->hBotonAceptar->Visible = false;
          break;
        case "Activo":
          if($diferenciaDias == "0") {
            $textoPlazoDias = "[Termina hoy]";
          } elseif($diferenciaDias == "1") {
            $textoPlazoDias = "[Termina ma&ntilde;ana]";
          } else {
            $textoPlazoDias = "[Terminar&aacute; en: $diferenciaDias d&iacute;a".( ($diferenciaDias == "1") ? "":"s" )."]";
          }
          $textoPlazoDias = "<span class=\"cssMensajeExito\">".$textoPlazoDias."</span>";
          break;
        case "Programado":
          if($diferenciaDias == "1") {
            $textoPlazoDias = "[Se activar&aacute; ma&ntilde;ana]";
          } else {
            $textoPlazoDias = "[Se activar&aacute; en: $diferenciaDias d&iacute;a".( ($diferenciaDias == "1") ? "":"s" )."]";
          }
          $textoPlazoDias = "<span class=\"cssAlerta\">".$textoPlazoDias."</span>";
          break;
        default:
          $textoPlazoDias = "";
          break;
      }
      $this->wucMarcoTopDatosNotificacion->Titulo = $this->wucMarcoTopDatosNotificacion->Titulo.$textoPlazoDias;

    } catch (Exception $e) {
      $titulo = "";
      $controlHtmlAsociado = "";
      $fechaInicio = "";
      $fechaTermino = "";
      $skin = "";
      $ajusteTop = "-100";
      $ajusteLeft = "";
      $ancho = "250";
      $recordarCada = "30";
      $activo = "0";
      $descripcion = "";
      $posicion = "";
      $estado = "";
      $diferenciaDias = "";
      $paginaAsociada = "";
    }
  }

  /**
   * inicializa algunos controles cuando se carga por primera vez la pagina
   * @param <type> $isPostBack
   * @author VSR, 01/01/2011
   */
  private function inicializaControles($isPostBack){
    try {
      $nombrePagina = $this->obtenerNombrePagina();
      $idNotificacion = $this->Request["id"];
      $estado = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("Estado".$nombrePagina), "");
      $cargarDesdePopUp = "0";

      if($estado == "INGRESADO" || $estado == "MODIFICADO" || $estado == "ELIMINADO") {
        $cargarDesdePopUp = "1";
      }

      //agrega atributo a control
      $this->btnCrear->Attributes->Add("onclick", "return(validarFormularioNotificacion())");
      $this->btnAplicar->Attributes->Add("onclick", "return(validarFormularioNotificacion())");
      $this->btnAceptar->Attributes->Add("onclick", "return(validarFormularioNotificacion())");
      $this->btnEliminar->Attributes->Add("onclick", "return(validarEliminarNotificacion())");
      $this->btnCerrar->Attributes->Add("onclick", "cerrarPopUpNotificacion('','".$cargarDesdePopUp."','')");

      //inicializa los controles del Correlativo y Locales
      $this->inicializaControlesEventoWindowOnLoad($isPostBack);

      //verifica los permisos sobre los controles
      $this->verificarPermisos();

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * inicializa los controles al cargar la pagina
   * @param <type> $isPostBack
   * @author VSR, 01/01/2011
   */
  private function inicializaControlesEventoWindowOnLoad($isPostBack) {
    $nombrePagina = $this->obtenerNombrePagina();
    $estado = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("Estado".$nombrePagina), "");
    $sb = new StringBuilder();

    if($estado == "INGRESADO" || $estado == "MODIFICADO" || $estado == "") {
      $sb->appendLine("setTimeout(\"ocultarElemento('".$this->pnlMensajeUsuario->ClientID."')\", 5000);");
    }
    $this->Page->ClientScript->registerEndScript("windowOnLoad", $sb->toString());
  }

  /**
   * verifica los permisos sobre los controles
   * @author VSR, 01/01/2011
   */
  private function verificarPermisos(){
    $paginaActual = Utilidades::obtenerNombrePaginaActual($this);
    $idNotificacion = $this->Request["id"];
    //verifica los permisos para los controles
    $this->pnlContenido->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER);
    $this->hBotonCrear->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idNotificacion == "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_CREAR);
    $this->hBotonAplicar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idNotificacion != "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_EDITAR);
    $this->hBotonAceptar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idNotificacion != "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_EDITAR);
    $this->hBotonEliminar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idNotificacion != "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_ELIMINAR);

    if(!$this->pnlContenido->Visible) {
      $this->pnlMensajeAcceso->Visible = true;
      Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "No tiene permiso para ver esta p&aacute;gina", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
    }
  }

  /**
   * muestra mensaje al usuario
   * @author VSR, 01/01/2011
   */
  private function mostrarMensajeUsuario(){
    try {
      $mensaje = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("msg"),"");
      $baseUrl = $this->Page->Theme->BaseUrl;

      //asigna mensaje al panel
      $this->pnlMensajeUsuario->Visible = true;

      //dependiendo de la marca especial que tenga el sistema es como se muestra el mensaje al usuario
      if(strpos($mensaje, "{#INGRESADO}") === 0) {
        $mensaje = str_replace("{#INGRESADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#MODIFICADO}") === 0) {
        $mensaje = str_replace("{#MODIFICADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#ELIMINADO}") === 0) {
        $mensaje = str_replace("{#ELIMINADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#DUPLICADO}") === 0) {
        $mensaje = str_replace("{#DUPLICADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } elseif (strpos($mensaje, "{#ERROR}") === 0) {
        $mensaje = str_replace("{#ERROR}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } else {
        $this->pnlMensajeUsuario->Visible = false;
      }
      Utilidades::grabarSessionPorNombre("msg", "");
    } catch (Exception $e) {
      $this->pnlMensajeUsuario->Visible = false;
    }

  }

  /**
   * obtiene nombre de la pagina actual
   * @return <type>
   * @author VSR, 01/01/2011
   */
  private function obtenerNombrePagina(){
    $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
    return $nombrePagina;
  }

  /**
   * graba los datos de la notificacion
   * @author VSR, 01/01/2011
   */
  private function grabarNotificacion($accion) {
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $idNotificacion = $this->Request["id"];
      $status = "";
      $textoMensaje = "";
      $grabadoConExito = true;
      $queryString = "";

      //grabar valores
      $textoMensaje .= $this->grabarDatosNotificacion($status, $idNotificacion);

      if ($textoMensaje != "") {
        $grabadoConExito = false;
      } else {
        $grabadoConExito = true;
      }

      //muestra mensaje dependiendo si se grabo o no
      if ($grabadoConExito) {
        switch ($status) {
          case "ingresado":
            $textoMensaje = "{#INGRESADO}La notificaci&oacute;n fue ingresada satisfactoriamente.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "INGRESADO");
            break;
          case "modificado":
            $textoMensaje = "{#MODIFICADO}La notificaci&oacute;n fue actualizada satisfactoriamente.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "MODIFICADO");
            break;
          case "error":
            $textoMensaje = "{#ERROR}Se produjo un error interno y no se pudo ingresar la notificaci&oacute;n. Intente nuevamente por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
            break;
          default:
            break;
        }
      } else {
        $textoMensaje = "{#ERROR}".$textoMensaje;
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
      }

      if (($status == "ingresado" || $status == "modificado") && $accion == Sistema::ACEPTAR ) {
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "");
        $this->Page->ClientScript->registerEndScript("cerrarPopUp", "cerrarPopUpNotificacion('".$idNotificacion."','1','".urlEncode($this->txtTitulo->Text)."');");
      } else {
        Utilidades::grabarSessionPorNombre("msg", $textoMensaje);
        //construye query string con los valores correspondientes
        $queryString = "&id=".$idNotificacion;
        $this->Response->redirect("index.php?page=".$nombrePagina.$queryString);
      }
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * graba o actualiza la notificacion en base de datos
   * @param <type> $status
   * @param <type> $iNotificacion
   * @return string
   * @author VSR, 01/01/2011
   */
  private function grabarDatosNotificacion(&$status, &$iNotificacion) {
    $msgError = "";
    try {
      $titulo = Utilidades::isNull($this->txtTitulo->Text, "");
      $controlHtmlAsociado = Utilidades::isNull($this->txtControlHtmlAsociado->Text, "");
      $paginaAsociada = Utilidades::isNull($this->txtPaginaAsociada->Text, "");
      $fechaInicio = Utilidades::isNull($this->txtFechaInicio->Text, "");
      $fechaTermino = Utilidades::isNull($this->txtFechaTermino->Text, "");
      $skin = Utilidades::isNull($this->ddlSkin->obtenerSelectedValue(), "");
      $posicion = Utilidades::isNull($this->ddlPosicion->obtenerSelectedValue(), "");
      $ajusteTop = Utilidades::isNull($this->txtAjusteTop->Text, "");
      $ajusteLeft = Utilidades::isNull($this->txtAjusteLeft->Text, "");
      $ancho = Utilidades::isNull($this->txtAncho->Text, "");
      $recordarCada = Utilidades::isNull($this->txtRecordarCada->Text, "-1");
      $activo = ($this->chkActivo->Checked) ? "1" : "0";
      $descripcion = Utilidades::isNull($this->txtDescripcion->Text, "");
      $asignar = $this->Request["groupUsuario"];
      $listadoIdUsuarios = $this->msUsuarios->valueListadoId();

      if($asignar == "Todos") { $listadoIdUsuarios = ""; }
      $arr = Notificacion::grabarDatos($iNotificacion, $titulo, $descripcion, $controlHtmlAsociado, $fechaInicio, $fechaTermino, $activo, $skin, $ajusteTop, $ajusteLeft, $ancho, $recordarCada, $posicion, $listadoIdUsuarios, $paginaAsociada);

      if(is_null($arr)){
        throw new Exception("Error al ejecutar Notificacion->grabarDatosNotificacion()");
      } else {
        $iNotificacion = $arr[0]["IdNotificacion"];
        $status = $arr[0]["Status"];
        if ($status == "duplicado") { $iNotificacion = "0"; }
      }
    } catch (Exception $e) {
      $msgError = "Se produjo un error interno, no se pudo grabar la notificaci&oacute;n.<br/>";
      $iNotificacion = ($iNotificacion > 0) ? $iNotificacion : "0";
      $status = "error";
    }
    return $msgError;
  }

  /**
   * elimina los datos de la notificacion
   * @param <type> $status
   * @param <type> $idNotificacion
   * @return string
   * @author VSR, 01/01/2011
   */
  private function eliminarNotificacion(&$status, $idNotificacion) {
    $msgError = "";

    try {
      $status = Notificacion::eliminarDatos($idNotificacion);
    } catch (Exception $e) {
      $msgError = "Se produjo un error interno, no se pudo eliminar la notificaci&oacute;n.<br/>".$e->getMessage();
    }
    //retorna valor
    return $msgError;
  }

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Eventos Controles">
  public function onLoad($param) {
    parent::onLoad($param);
    //si no esta conectado entonces lo redirecciona al login
    if(!$this->usuarioLogueado()){
      $this->redireccionarLogin();
    }
    $idNotificacion = $this->Request["id"];
    $nombrePagina = $this->obtenerNombrePagina();
    $this->txtThemeBaseUrl->Value = $this->Page->Theme->BaseUrl;

    if(!$this->IsPostBack) {
      $this->obtenerDatos($idNotificacion);
      $this->inicializaControles($this->IsPostBack);
      $this->actualizaInterfaz();
      $this->mostrarMensajeUsuario();
      Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "");
    }

  }

  public function btnCrearClick($sender, $param){
    $this->grabarNotificacion(Sistema::APLICAR);
  }

  public function btnAplicarClick($sender, $param){
    $this->grabarNotificacion(Sistema::APLICAR);
  }

  public function btnAceptarClick($sender, $param){
    $this->grabarNotificacion(Sistema::ACEPTAR);
  }

  public function btnEliminarClick($sender, $param){
    $idNotificacion = $this->Request["id"];
    $status = "";
    $textoMensaje = "";
    $eliminadoConExito = true;
    $queryString = "";

    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      //elimina la pagina
      $textoMensaje .= $this->eliminarNotificacion($status, $idNotificacion);

      if ($textoMensaje != "") {
        $eliminadoConExito = false;
      } else {
        $eliminadoConExito = true;
      }

      //muestra mensaje dependiendo si se grabo o no
      if ($eliminadoConExito) {
        switch ($status) {
          case "eliminado":
            $textoMensaje = "{#ELIMINADO}La notificaci&oacute;n fue eliminada satisfactoriamente. Complete el formulario para ingresar una nueva.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ELIMINADO");
            break;
          case "error":
            $textoMensaje = "{#ERROR}Se produjo un error interno y no se pudo eliminar la notificaci&oacute;n. Intente nuevamente por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
            break;
        }
      } else {
        $textoMensaje = "{#ERROR}".$textoMensaje;
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
      }

      /*
       * DESCOMENTAR ESTE IF SI SE QUIERE QUE LA PAGINA SE CIERRE AUTOMATICAMENTE
      if ($status == "ingresado" || $status == "modificado") {
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "");
        $this->Page->ClientScript->registerEndScript("cerrarPopUp", "cerrarPopUpNotificacion('".$idNotificacion."','1','".urlEncode($this->txtTitulo->Text)."');");
      } else {
      */
        Utilidades::grabarSessionPorNombre("msg", $textoMensaje);
        //construye query string con los valores correspondientes
        $queryString = "&id=".(($status == "eliminado") ? "0" : $idNotificacion);
        $this->Response->redirect("index.php?page=".$nombrePagina.$queryString);
      /*}*/
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

//</editor-fold>

}

?>
